package com.company.module.net.factory;//package com.company.app.common.http.factory;
//
//import android.text.TextUtils;
//import android.util.Log;
//
//import com.company.app.common.base.BaseApplication;
//import com.company.app.common.utils.SpKeyUtils;
//import com.company.app.common.utils.SPUtils;
//import com.google.gson.Gson;
//
//import java.io.IOException;
//import java.lang.annotation.Annotation;
//import java.lang.reflect.InvocationHandler;
//import java.lang.reflect.InvocationTargetException;
//import java.lang.reflect.Method;
//import java.nio.charset.Charset;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//
//import okhttp3.MediaType;
//import okhttp3.RequestBody;
//import okio.Buffer;
//import retrofit2.http.Body;
//import retrofit2.http.Query;
//import rx.Observable;
//import rx.functions.Func1;
//
///**
// * 代理
// * Created by YaNan
// * on 2017/3/24 0024.
// */
//
//public class ProxyHandler implements InvocationHandler {
//
//    private final static String TAG = "ProxyHandler";
//    private final static String TOKEN = "token";
//    private final static int REFRESH_TOKEN_VALID_TIME = 30;
//    private static long tokenChangedTime;
//    private Throwable mRefreshTokenError = null;
//    private boolean mIsTokenNeedRefresh;
//    private Object mProxyObject;
//    private int refresh = 0;
//
//    public ProxyHandler(Object proxyObject) {
//        mProxyObject = proxyObject;
//    }
//
//    @Override
//    public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
//        return Observable.just(null).flatMap(new Func1<Object, Observable<?>>() {
//
//            @Override
//            public Observable<?> call(Object o) {
//                try {
//                    try {
//                        if (mIsTokenNeedRefresh) {
//                            updateMethodToken(method, args);
//                        }
//                        return (Observable<?>) method.invoke(mProxyObject, args);
//                    } catch (InvocationTargetException e) {
//                        e.printStackTrace();
//                    }
//                } catch (IllegalAccessException e) {
//                    e.printStackTrace();
//                }
//                return null;
//            }
//        }).retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
//
//            @Override
//            public Observable<?> call(Observable<? extends Throwable> observable) {
//                return observable.flatMap(new Func1<Throwable, Observable<?>>() {
//
//                    @Override
//                    public Observable<?> call(Throwable throwable) {
//                        if (throwable instanceof IllegalArgumentException
//                                && throwable.getMessage().equals("Token_refresh")) {//可自定义过期异常
//                            return refreshTokenWhenTokenInvalid();//获取新的token
//                        } else {
//                            //其他异常可以执行退出登录操作
//                            //return Observable.error(throwable);
//                        }
//                        return Observable.error(throwable);
//                    }
//                });
//            }
//        });
//    }
//
//    private Observable<?> refreshTokenWhenTokenInvalid() {
//        synchronized (ProxyHandler.class) {
//            if (new Date().getTime() - tokenChangedTime < REFRESH_TOKEN_VALID_TIME) {
//                mIsTokenNeedRefresh = true;
//                return Observable.just(true);
//            } else {
//                mRefreshTokenError = null;
//                refresh++;
//                if (refresh > 2) {
//                    Log.e(TAG," ARouterManager.startLoginModule()");
//                    return Observable.error(mRefreshTokenError);
//                }
//                if (!TextUtils.isEmpty(getSp().getString(SpKeyUtils.USER_NAME, null))) {
//                    if (!TextUtils.isEmpty(getSp().getString(SpKeyUtils.PASS_WORD, null))) {
//                        Map<String, Object> params = new HashMap();
//                        params.put("userName", getSp().getString(SpKeyUtils.USER_NAME, null));
//                        params.put("password", getSp().getString(SpKeyUtils.PASS_WORD, null));
//                        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), new Gson().toJson(params));
////                        RetrofitUtil.getInstance().getHttpApi(ConstantValues.BASE_URL, BaseHttpApi.class).login(requestBody).subscribe(new Subscriber<BaseBean<BaseLoginInfo>>() {
////                            @Override
////                            public void onCompleted() {
////                            }
////
////                            @Override
////                            public void onError(Throwable e) {
////                                Log.e(TAG, "------刷新失败");
////                            }
////
////                            @Override
////                            public void onNext(BaseBean<BaseLoginInfo> responseLogin) {
////                                if (responseLogin != null && responseLogin.isSuccess()) {
////                                    mIsTokenNeedRefresh = true;
////                                    tokenChangedTime = new Date().getTime();
////                                    BaseLoginInfo info = (BaseLoginInfo) responseLogin.getData();
////                                    Log.e(TAG, "-------新token" + info.getToken());
////                                    if (info.getToken() != null) {
////                                        SharedPreferencesUtils.save(BaseApplication.getInstance(), SPKey.APP_TOKEN, info.getToken());
////                                    }
////                                }
////                            }
////                        });
//
//                    }
//                }
//            }
//
//            if (mRefreshTokenError != null) {
//                return Observable.error(mRefreshTokenError);
//            } else {
//                return Observable.just(true);
//            }
//        }
//    }
//
//
//    /**
//     * Update the token of the args in the method.
//     */
//    private void updateMethodToken(Method method, Object[] args) {
//        if (mIsTokenNeedRefresh && !TextUtils.isEmpty(getSp().getString( SpKeyUtils.APP_TOKEN, null))) {
//            Annotation[][] annotationsArray = method.getParameterAnnotations();
//            Annotation[] annotations;
//            if (annotationsArray != null && annotationsArray.length > 0) {
//                for (int i = 0; i < annotationsArray.length; i++) {
//                    annotations = annotationsArray[i];
//                    for (Annotation annotation : annotations) {
//                        if (annotation instanceof Query) {
//                            if (TOKEN.equals(((Query) annotation).value())) {
//                                args[i] = getSp().getString( SpKeyUtils.APP_TOKEN, null);
//                                Log.i(TAG, "----->在这里更新token");
//                            }
//                        }
//                    }
//                }
//            }
//            mIsTokenNeedRefresh = false;
//        }
//    }
//    private SPUtils getSp() {
//        return BaseApplication.getSpUtil();
//    }
//
//    /**
//     *
//     * @param method
//     * @param args
//     */
//    private void updateMethodTokenBodyAndQuery(Method method, Object[] args) {
//        if (mIsTokenNeedRefresh && !TextUtils.isEmpty(getSp().getString(SpKeyUtils.APP_TOKEN, null))) {
//            Annotation[][] annotationsArray = method.getParameterAnnotations();
//            Annotation[] annotations;
//            if (annotationsArray != null && annotationsArray.length > 0) {
//                for (int i = 0; i < annotationsArray.length; i++) {
//                    annotations = annotationsArray[i];
//                    for (Annotation annotation : annotations) {
//                        if (annotation instanceof Body) {
//                            RequestBody requestBody = (RequestBody) args[i];
//                            args[i] = getTokenRequestBody(requestBody);
//                            Log.i("ProxyHandler", "----->在这里更新Body中的token");
//                        }
//                        if (annotation instanceof Query) {
//                            if (TOKEN.equals(((Query) annotation).value())) {
//                                args[i] = getSp().getString(SpKeyUtils.APP_TOKEN, null);
//                                Log.i("ProxyHandler", "----->在这里更新Query中的token");
//                            }
//                        }
//                    }
//                }
//            }
//            mIsTokenNeedRefresh = false;
//        }
//    }
//
//    public RequestBody getTokenRequestBody(RequestBody requestBody) {
//        if (requestBody != null) {
//            Buffer buffer = new Buffer();
//            try {
//                requestBody.writeTo(buffer);
//                Charset charset = Charset.forName("UTF-8");
//                MediaType contentType = requestBody.contentType();
//                if (contentType != null) {
//                    charset = contentType.charset();
//                }
//                String paramsStr = buffer.readString(charset);
//                Map<String, Object> params = new Gson().fromJson(paramsStr, Map.class);
//                params.put(TOKEN, getSp().getString(SpKeyUtils.APP_TOKEN));
//                requestBody = RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), new Gson().toJson(params));
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//
//        }
//        return requestBody;
//    }
//}
